# -*- coding:utf-8 -*-
__author__: 'Rvelamen'
__data__ = '2022/3/18 16:55'

# !/usr/bin/python3
# -*- coding:utf-8 -*-
# __author__ = '__Jack__'

from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
from app.core.config import settings


# SQLALCHEMY_DATABASE_URL = 'sqlite:///./coronavirus.sqlite3'
# SQLALCHEMY_DATABASE_URL = 'mysql+pymysql://root:12345678@localhost:3306/fastapi?charset=utf8'
# SQLALCHEMY_DATABASE_URL = "postgresql://username:password@host:port/database_name"  # MySQL或PostgreSQL的连接方法

def is_open_thread():
    """ 是否关闭sqlite单线程 """
    if settings.DATABASE_URL.startswith('sqlite'):
        return {"check_same_thread": False}
    else:
        return ''


engine = create_engine(
    # echo=True表示引擎将用repr()函数记录所有语句及其参数列表到日志
    # 由于SQLAlchemy是多线程，指定check_same_thread=False来让建立的对象任意线程都可使用。这个参数只在用SQLite数据库时设置
    url=settings.DATABASE_URL, encoding='utf-8', echo=settings.DATABASE_ECHO, connect_args=is_open_thread()
)

# 在SQLAlchemy中，CRUD都是通过会话(session)进行的，所以我们必须要先创建会话，每一个SessionLocal实例就是一个数据库session
# flush()是指发送数据库语句到数据库，但数据库不一定执行写入磁盘；commit()是指提交事务，将变更保存到数据库文件
SessionLocal = sessionmaker(bind=engine, autoflush=False, autocommit=False, expire_on_commit=True)
